/**
 * The MIT License (MIT)
 * 
 * Copyright (c) 2016 mo_yq5 (mo_yq5@163.com)
 * 
 * Permission is hereby granted, free of charge, to any person obtaining a copy of
 * this software and associated documentation files (the "Software"), to deal in
 * the Software without restriction, including without limitation the rights to
 * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
 * the Software, and to permit persons to whom the Software is furnished to do so,
 * subject to the following conditions:
 * 
 * The above copyright notice and this permission notice shall be included in all
 * copies or substantial portions of the Software.
 */
package com.openapi.weixin.pay.unifiedorder;

import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlCData;
import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty;
import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlRootElement;

/**
 * 扫码支付－统一下单－请求参数
 * @author Moyq5
 * @since 2016年8月8日
 */
@JacksonXmlRootElement(localName = "xml")
public class WeixinPayUnifiedOrder {
 
	/**
	 * 公众账号ID，微信分配的公众账号ID<br>
	 * 必填，最长32，如：wx8888888888888888
	 */
	@JacksonXmlProperty(localName = "appid")
	private String appId;
	
	/**
	 * 商户号，微信支付分配的商户号<br>
	 * 必填，最长32，如：1900000109
	 */
	@JacksonXmlProperty(localName = "mch_id")
	private String mchId;
	
	/**
	 * 子商户公众账号ID，微信分配的子商户公众账号ID，如需在支付完成后获取sub_openid则此参数必传。<br>
	 * 最长32，如：wx8888888888888888
	 */
	@JacksonXmlProperty(localName = "sub_appid")
	private String subAppId;
	
	/**
	 * 子商户号，微信支付分配的子商户号<br>
	 * 必填，最长32，如：1900000109
	 */
	@JacksonXmlProperty(localName = "sub_mch_id")
	private String subMchId;
	
	/**
	 * 设备号，终端设备号(门店号或收银设备ID)，注意：PC网页或公众号内支付请传"WEB"<br>
	 * 最长32，如：013467007045764
	 */
	@JacksonXmlProperty(localName = "device_info")
	private String deviceInfo;
	
	/**
	 * 随机字符串，不长于32位。推荐<a href="https://pay.weixin.qq.com/wiki/doc/api/native_sl.php?chapter=4_3">随机数生成算法</a><br>
	 * 必填，最长32，如：5K8264ILTKCH16CQ2502SI8ZNMTM67VS
	 */
	@JacksonXmlProperty(localName = "nonce_str")
	private String nonceStr;
	
	/**
	 * 签名，详见<a href="https://pay.weixin.qq.com/wiki/doc/api/native_sl.php?chapter=4_3">签名生成算法</a><br>
	 * 必填，最长32，如：C380BEC2BFD727A4B6845133519F3AD6
	 */
	private String sign;
	
	/**
	 * 商品描述，商品描述交易字段格式根据不同的应用场景按照以下格式：<br>
	 * （1）PC网站——传入浏览器打开的网站主页title名-实际商品名称，例如：腾讯充值中心-QQ会员充值；<br>
	 * （2） 公众号——传入公众号名称-实际商品名称，例如：腾讯形象店- image-QQ公仔；<br>
	 * （3） H5——应用在浏览器网页上的场景，传入浏览器打开的移动网页的主页title名-实际商品名称，例如：腾讯充值中心-QQ会员充值；<br>
	 * （4） 线下门店——门店品牌名-城市分店名-实际商品名称，例如： image形象店-深圳腾大- QQ公仔）<br>
	 * （5） APP——需传入应用市场上的APP名字-实际商品名称，天天爱消除-游戏充值。<br>
	 * 必填，最长128，如：腾讯充值中心-QQ会员充值
	 */
	private String body;
	
	/**
	 * 商品详情<br>
	 * 最长8192
	 */
	@JacksonXmlCData
	private String detail;
	
	/**
	 * 附加数据，在查询API和支付通知中原样返回，该字段主要用于商户携带订单的自定义数据<br>
	 * 最长127
	 */
	private String attach;
	
	/**
	 * 商户订单号，商户系统内部的订单号,32个字符内、可包含字母<br>
	 * 必填，最长32，如：1217752501201407033233368018
	 */
	@JacksonXmlProperty(localName = "out_trade_no")
	private String outTradeNo;
	
	/**
	 * 货币类型，符合ISO 4217标准的三位字母代码，默认人民币：CNY，其他值列表详见<a href="https://pay.weixin.qq.com/wiki/doc/api/native_sl.php?chapter=4_2">货币类型</a><br>
	 * 最长16，如：CNY
	 */
	@JacksonXmlProperty(localName = "fee_type")
	private String feeType;
	
	/**
	 * 订单总金额，单位：分，只能为整数，详见<a href="https://pay.weixin.qq.com/wiki/doc/api/native_sl.php?chapter=4_2">支付金额</a><br>
	 * 必填，如：888
	 */
	@JacksonXmlProperty(localName = "total_fee")
	private Integer totalFee;
	
	/**
	 * 终端IP，APP和网页支付提交用户端ip，Native支付填调用微信支付API的机器IP。<br>
	 * 必填，最长16，如：123.12.12.123
	 */
	@JacksonXmlProperty(localName = "spbill_create_ip")
	private String spBillCreateIp;
	
	/**
	 * 交易起始时间，订单生成时间，格式为yyyyMMddHHmmss，如2009年12月25日9点10分10秒表示为20091225091010。<br>
	 * 最长14，如：20091225091010
	 */
	@JacksonXmlProperty(localName = "time_start")
	private String timeStart;
	
	/**
	 * 交易结束时间，订单失效时间，格式为yyyyMMddHHmmss，如2009年12月27日9点10分10秒表示为20091227091010。<br>
	 * 最长14，如：20091225091010
	 */
	@JacksonXmlProperty(localName = "time_expire")
	private String timeExpire;
	
	/**
	 * 商品标记，商品标记，代金券或立减优惠功能的参数<br>
	 * 最长32，如：WXG
	 */
	@JacksonXmlProperty(localName = "goods_tag")
	private String goodsTag;
	
	/**
	 * 通知地址，接收微信支付异步通知回调地址，通知url必须为直接可访问的url，不能携带参数。<br>
	 * 必填，最长256，如：http://www.weixin.qq.com/wxpay/pay.php
	 */
	@JacksonXmlProperty(localName = "notify_url")
	private String notifyUrl;
	
	/**
	 * 交易类型，取值如下：JSAPI，NATIVE，APP，详细说明见参数规定<br>
	 * JSAPI--公众号支付、NATIVE--原生扫码支付、APP--app支付，统一下单接口trade_type的传参可参考这里，<br>
	 * MICROPAY--刷卡支付，刷卡支付有单独的支付接口，不调用统一下单接口<br>
	 * 必填，最长16，如：JSAPI
	 */
	@JacksonXmlProperty(localName = "trade_type")
	private String tradeType;
	
	/**
	 * 商品ID，trade_type=NATIVE，此参数必传。此id为二维码中包含的商品ID，商户自行定义。<br>
	 * 最长32，如：12235413214070356458058
	 */
	@JacksonXmlProperty(localName = "product_id")
	private String productId;
	
	/**
	 * 指定支付方式，no_credit--指定不能使用信用卡支付<br>
	 * 最长32，如：no_credit
	 */
	@JacksonXmlProperty(localName = "limit_pay")
	private String limitPay;
	
	/**
	 * 用户标识，trade_type=JSAPI，此参数必传，用户在主商户appid下的唯一标识。<br>
	 * openid和sub_openid可以选传其中之一，如果选择传sub_openid,则必须传sub_appid。<br>
	 * 下单前需要调用【网页授权获取用户信息】接口获取到用户的Openid。<br>
	 * 最长128，如：oUpF8uMuAJO_M2pxb1Q9zNjWeS6o
	 */
	@JacksonXmlProperty(localName = "openid")
	private String openId;
	
	/**
	 * 用户标识，trade_type=JSAPI，此参数必传，用户在主商户appid下的唯一标识。<br>
	 * openid和sub_openid可以选传其中之一，如果选择传sub_openid,则必须传sub_appid。<br>
	 * 下单前需要调用【网页授权获取用户信息】接口获取到用户的Openid。<br>
	 * 最长128，如：oUpF8uMuAJO_M2pxb1Q9zNjWeS6o
	 */
	@JacksonXmlProperty(localName = "sub_openid")
	private String subOpenId;

	/**
	 * @return the appId
	 */
	public String getAppId() {
		return appId;
	}

	/**
	 * @param appId the appId to set
	 */
	public void setAppId(String appId) {
		this.appId = appId;
	}

	/**
	 * @return the mchId
	 */
	public String getMchId() {
		return mchId;
	}

	/**
	 * @param mchId the mchId to set
	 */
	public void setMchId(String mchId) {
		this.mchId = mchId;
	}

	/**
	 * @return the subAppId
	 */
	public String getSubAppId() {
		return subAppId;
	}

	/**
	 * @param subAppId the subAppId to set
	 */
	public void setSubAppId(String subAppId) {
		this.subAppId = subAppId;
	}

	/**
	 * @return the subMchId
	 */
	public String getSubMchId() {
		return subMchId;
	}

	/**
	 * @param subMchId the subMchId to set
	 */
	public void setSubMchId(String subMchId) {
		this.subMchId = subMchId;
	}

	/**
	 * @return the deviceInfo
	 */
	public String getDeviceInfo() {
		return deviceInfo;
	}

	/**
	 * @param deviceInfo the deviceInfo to set
	 */
	public void setDeviceInfo(String deviceInfo) {
		this.deviceInfo = deviceInfo;
	}

	/**
	 * @return the nonceStr
	 */
	public String getNonceStr() {
		return nonceStr;
	}

	/**
	 * @param nonceStr the nonceStr to set
	 */
	public void setNonceStr(String nonceStr) {
		this.nonceStr = nonceStr;
	}

	/**
	 * @return the sign
	 */
	public String getSign() {
		return sign;
	}

	/**
	 * @param sign the sign to set
	 */
	public void setSign(String sign) {
		this.sign = sign;
	}

	/**
	 * @return the body
	 */
	public String getBody() {
		return body;
	}

	/**
	 * @param body the body to set
	 */
	public void setBody(String body) {
		this.body = body;
	}

	/**
	 * @return the detail
	 */
	public String getDetail() {
		return detail;
	}

	/**
	 * @param detail the detail to set
	 */
	public void setDetail(String detail) {
		this.detail = detail;
	}

	/**
	 * @return the attach
	 */
	public String getAttach() {
		return attach;
	}

	/**
	 * @param attach the attach to set
	 */
	public void setAttach(String attach) {
		this.attach = attach;
	}

	/**
	 * @return the outTradeNo
	 */
	public String getOutTradeNo() {
		return outTradeNo;
	}

	/**
	 * @param outTradeNo the outTradeNo to set
	 */
	public void setOutTradeNo(String outTradeNo) {
		this.outTradeNo = outTradeNo;
	}

	/**
	 * @return the feeType
	 */
	public String getFeeType() {
		return feeType;
	}

	/**
	 * @param feeType the feeType to set
	 */
	public void setFeeType(String feeType) {
		this.feeType = feeType;
	}

	/**
	 * @return the totalFee
	 */
	public Integer getTotalFee() {
		return totalFee;
	}

	/**
	 * @param totalFee the totalFee to set
	 */
	public void setTotalFee(Integer totalFee) {
		this.totalFee = totalFee;
	}

	/**
	 * @return the spBillCreateIp
	 */
	public String getSpBillCreateIp() {
		return spBillCreateIp;
	}

	/**
	 * @param spBillCreateIp the spBillCreateIp to set
	 */
	public void setSpBillCreateIp(String spBillCreateIp) {
		this.spBillCreateIp = spBillCreateIp;
	}

	/**
	 * @return the timeStart
	 */
	public String getTimeStart() {
		return timeStart;
	}

	/**
	 * @param timeStart the timeStart to set
	 */
	public void setTimeStart(String timeStart) {
		this.timeStart = timeStart;
	}

	/**
	 * @return the timeExpire
	 */
	public String getTimeExpire() {
		return timeExpire;
	}

	/**
	 * @param timeExpire the timeExpire to set
	 */
	public void setTimeExpire(String timeExpire) {
		this.timeExpire = timeExpire;
	}

	/**
	 * @return the goodsTag
	 */
	public String getGoodsTag() {
		return goodsTag;
	}

	/**
	 * @param goodsTag the goodsTag to set
	 */
	public void setGoodsTag(String goodsTag) {
		this.goodsTag = goodsTag;
	}

	/**
	 * @return the notifyUrl
	 */
	public String getNotifyUrl() {
		return notifyUrl;
	}

	/**
	 * @param notifyUrl the notifyUrl to set
	 */
	public void setNotifyUrl(String notifyUrl) {
		this.notifyUrl = notifyUrl;
	}

	/**
	 * @return the tradeType
	 */
	public String getTradeType() {
		return tradeType;
	}

	/**
	 * @param tradeType the tradeType to set
	 */
	public void setTradeType(String tradeType) {
		this.tradeType = tradeType;
	}

	/**
	 * @return the productId
	 */
	public String getProductId() {
		return productId;
	}

	/**
	 * @param productId the productId to set
	 */
	public void setProductId(String productId) {
		this.productId = productId;
	}

	/**
	 * @return the limitPay
	 */
	public String getLimitPay() {
		return limitPay;
	}

	/**
	 * @param limitPay the limitPay to set
	 */
	public void setLimitPay(String limitPay) {
		this.limitPay = limitPay;
	}

	/**
	 * @return the openId
	 */
	public String getOpenId() {
		return openId;
	}

	/**
	 * @param openId the openId to set
	 */
	public void setOpenId(String openId) {
		this.openId = openId;
	}

	/**
	 * @return the subOpenId
	 */
	public String getSubOpenId() {
		return subOpenId;
	}

	/**
	 * @param subOpenId the subOpenId to set
	 */
	public void setSubOpenId(String subOpenId) {
		this.subOpenId = subOpenId;
	}
	
}
